﻿/**
 *
 * @file FITKAcousticsMaterialsFluid.h
 * @brief 流体材料数据类声明
 * @author XingXuanCi (xingxuanci@diso.cn)
 * @date 2024-10-31
 *
 */
#ifndef FITKACOUSTICSMATERIALSFLUID_H
#define FITKACOUSTICSMATERIALSFLUID_H

#include "FITKAcousticsAbsMaterial.h"
#include "FITKAcousticsPhysicsAPI.h"

namespace Acoustics
{
    /**
     * @brief  流体材料数据类声明
     * @author XingXuanCi (xingxuanci@diso.cn)
     * @date   2024-10-31
     */
    class FITKAcousticsPhysicsAPI  FITKAcousticsMaterialsFluid : public FITKAcousticsAbsMaterial
    {
        FITKCLASS(Acoustics, FITKAcousticsMaterialsFluid);
        Q_OBJECT
    public:
        /**
        * @brief 流体类型
        * @author XingXuanCi (xingxuanci@diso.cn)
        * @date 2024-09-29
        */
        enum FluidType
        {
            Gas,              ///< 气体
            Liquid,           ///< 液体
        };
        Q_ENUM(FluidType);

    public:
        /**
         * @brief  构造函数
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-10-31
         */
        explicit FITKAcousticsMaterialsFluid();
        /**
         * @brief  析构函数
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-10-31
         */
        virtual ~FITKAcousticsMaterialsFluid() = default;
        /**
         * @brief 获取声学材料类型
         * @return AcousticsMaterialType 声学材料类型（流体）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        FITKAcousticsAbsMaterial::AcousticsMaterialType getAcousticsMaterialType() override;
        /**
         * @brief 获取声速（单位 m/s）
         * @return AcousticsMaterialType 声速（单位 m/s）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        double getSpeedOfSound() const;
        /**
         * @brief 设置声速（单位 m/s）
         * @param[i] speedOfSound 声速（单位 m/s）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        void setSpeedOfSound(double speedOfSound);
        /**
         * @brief 获取运动粘度（单位 m2/s）
         * @return double 运动粘度（单位 m2/s）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        double getKinematicViscosity() const;
        /**
         * @brief 设置运动粘度（单位 m2/s）
         * @param[i] kinematicViscosity 运动粘度（单位 m2/s）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        void setKinematicViscosity(double kinematicViscosity);
        /**
         * @brief 获取普朗特数（无量纲）
         * @return double 普朗特数（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        double getPrandtlNumber() const;
        /**
         * @brief 设置普朗特数（无量纲）
         * @param[i] prandtlNumber 普朗特数（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        void setPrandtlNumber(double prandtlNumber);
        /**
         * @brief 获取比热比（无量纲）
         * @return double 比热比（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        double getSpecificHeatsRatio() const;
        /**
         * @brief 设置比热比（无量纲）
         * @param[i] specificHeatsRatio 比热比（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        void setSpecificHeatsRatio(double specificHeatsRatio);
        /**
         * @brief 获取摩尔质量（无量纲）
         * @return double 摩尔质量（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        double getMolecularMass() const;
        /**
         * @brief 设置摩尔质量（无量纲）
         * @param[i] molecularMass 摩尔质量（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        void setMolecularMass(double molecularMass);
        /**
         * @brief 获取流体类型
         * @return FluidType 流体类型
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        FluidType getType() const;
        /**
         * @brief 设置流体类型
         * @param[i] type 流体类型
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date 2024-09-29
         */
        void setType(const FluidType &type);
        /**
        * @brief 复制数据对象,深拷贝，数据id不拷贝
        * @param[i] obj 被拷贝的对象
        * @return 是否执行成功
        * @author XingXuanCi (xingxuanci@diso.cn)
        * @date 2024-11-15
        */
        virtual bool copy(FITKAbstractDataObject* obj) override;
        /**
         * @brief 设置颜色，归一化表示
         * @param[i] r,g,b  颜色rgb值，范围是0.0-1.0
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-10-06
         */
        void setColor(float r, float g, float b);
        /**
         * @brief 获取颜色，归一化表示
         * @param[o] rgb  颜色rgb值，三个分量，范围是0.0-1.0
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-10-06
         */
        void getColor(float* rgb);
        /**
         * @brief    更新默认颜色
         * @return   void
         * @author   liuzhonghua (liuzhonghuaszch@163.com)
         * @date     2025-01-20
         */
        virtual void updateDefaultColor() override;
       
    private:
        /**
         * @brief  流体-声速（单位 m/s）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-09-29
         */
        double _speedOfSound{ 0.0 };
        /**
         * @brief  流体-运动粘度（单位 m2/s）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-09-29
         */
        double _kinematicViscosity{ 0.0 };
        /**
         * @brief  流体-普朗特数（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-09-29
         */
        double _prandtlNumber{ 0.0 };
        /**
         * @brief  流体-比热比（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-09-29
         */
        double _specificHeatsRatio{ 0.0 };
        /**
         * @brief  流体-摩尔质量（无量纲）
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-09-29
         */
        double _molecularMass{ 0.0 };
        /**
         * @brief  流体-类型
         * @author XingXuanCi (xingxuanci@diso.cn)
         * @date   2024-09-29
         */
        FluidType _type {FluidType::Gas};
        /**
         * @brief 颜色
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-12-19
         */
        float _color[3] = { 0.8196f, 0.8196f, 0.8196f };
        
    };
}

#endif // FITKACOUSTICSMATERIALSFLUID_H
